<?php
if (!defined('BASEPATH'))
exit('No direct script access allowed');

class Simage extends CI_Model {
    private $file;
    private $image;
    private $info;
	private $cache_patch = 'image';
	public function __construct() {
		 parent::__construct();
         $this->load->config('images');
	}
	public function cache($file = '', $name = '')
	{
		if (file_exists($file)) {
			if($name !=''){
				$this->run_cache($file);
			}
			else {
				$image_size = $this->config->item("image_sizes");
				if(isset($image_size)){
					foreach($image_size as $kname =>$size){
						if(isset($size[0])&& isset($size[1]))
							$this->run_cache($file,$size[0],$size[1]);
					}
				}
			}
			
    	} else {
      		return $this->template->url_page.$file;
    	}
	}
	
	public function run_cache($file = '', $width = '', $height ='')
	{
		$dir_cache = $this->create_dirs(str_replace("images",$this->cache_patch,$file));
		$file_name = basename($file);
		$full_patch = $dir_cache.$width."x".$height."-".$file_name;
		$config['image_library'] = 'gd2';
		$config['source_image']	= "./".$file;
		$config['new_image'] = $full_patch;
		//$config['create_thumb'] = TRUE;
		$config['maintain_ratio'] = TRUE; // TRUE
		$config['width']	 = $width;
		$config['height']	= $height;

		$this->load->library('image_lib', $config); 
		$this->image_lib->initialize($config);
		if(!$this->image_lib->resize()){
		   //echo $this->image_lib->display_errors();
			return $this->template->url_page.$file;
			}
		//$this->runUnsharpMask($config['new_image']);
		return $this->template->url_page.$config['new_image'];
    	
	}
	
	function runUnsharpMask($full_patch){
		$extension = end(explode(".",$full_patch));
		if ($extension != 'png'){
			$source_image = imagecreatefromjpeg($full_patch);
			$unsharp_result=$this->UnsharpMask($source_image, $full_patch, 100, 1, 3, 100);
			imagedestroy($source_image);
		}
	}
	
	function create_dirs($file =''){
	//$dir_paths = explode("/",str_replace("images",$this->cache_patch,$file));
	$dir_paths = explode("/",$file);
	$dir = "";
	for($i=0; $i<count($dir_paths) -1; $i++){
		$dir_path = $dir_paths[$i];
		$dir.= $dir_path."/";
		if (!is_dir($dir)) {
			mkdir($dir);
			chmod($dir, 0777);
		}
	}
	return $dir;
	}
	
	function delete($full_patch =''){
		if (file_exists($full_patch)) {
			$name_file = basename($full_patch);
			$patch = str_replace($name_file,"",$full_patch);
			$patch = str_replace("images/",$this->cache_patch."/",$patch);
			$files = glob($patch."*x*-".$name_file);
			foreach($files as $file){
			  if(is_file($file)){
				 unlink($file);
			  }
			}
   			return true;
		}
		return false;
	}
	function UnsharpMask($image_path, $image_destination, $amount, $radius, $threshold, $quality){ 
  if (empty($quality)) $quality=88;

////////////////////////////////////////////////////////////////////////////////////////////////  
////  
////                  Unsharp Mask for PHP - version 2.1.1  
////  
////    Unsharp mask algorithm by Torstein H?nsi 2003-07.  
////             thoensi_at_netcom_dot_no.  
////               Please leave this notice.  
////  
///////////////////////////////////////////////////////////////////////////////////////////////  



    // $image_path is an image that is already created within php using 
    // imgcreatetruecolor. No url! $image_path must be a truecolor image. 

    // Attempt to calibrate the parameters to Photoshop: 
    if ($amount > 500)    $amount = 500; 
    $amount = $amount * 0.016; 
    if ($radius > 50)    $radius = 50; 
    $radius = $radius * 2; 
    if ($threshold > 255)    $threshold = 255; 
     
    $radius = abs(round($radius));     // Only integers make sense. 
    if ($radius == 0) { 
        return false; break;        
  } 
  // open image file
  $im = $image_path;

  $w=imageSX($im);
  $h=imageSY($im); 

    $imgCanvas = imagecreatetruecolor($w, $h); 
    $imgBlur = imagecreatetruecolor($w, $h); 
     

    // Gaussian blur matrix: 
    //                         
    //    1    2    1         
    //    2    4    2         
    //    1    2    1         
    //                         
    ////////////////////////////////////////////////// 
         

    if (function_exists('imageconvolution')) { // PHP >= 5.1  
            $matrix = array(  
            array( 1, 2, 1 ),  
            array( 2, 4, 2 ),  
            array( 1, 2, 1 )  
        );  
        imagecopy ($imgBlur, $im, 0, 0, 0, 0, $w, $h); 
        imageconvolution($imgBlur, $matrix, 16, 0);  
    }  
    else {  

    // Move copies of the image around one pixel at the time and merge them with weight 
    // according to the matrix. The same matrix is simply repeated for higher radii. 
        for ($i = 0; $i < $radius; $i++)    { 
            imagecopy ($imgBlur, $im, 0, 0, 1, 0, $w - 1, $h); // left 
            imagecopymerge ($imgBlur, $im, 1, 0, 0, 0, $w, $h, 50); // right 
            imagecopymerge ($imgBlur, $im, 0, 0, 0, 0, $w, $h, 50); // center 
            imagecopy ($imgCanvas, $imgBlur, 0, 0, 0, 0, $w, $h); 

            imagecopymerge ($imgBlur, $imgCanvas, 0, 0, 0, 1, $w, $h - 1, 33.33333 ); // up 
            imagecopymerge ($imgBlur, $imgCanvas, 0, 1, 0, 0, $w, $h, 25); // down 
        } 
    } 

    if($threshold>0){ 
        // Calculate the difference between the blurred pixels and the original 
        // and set the pixels 
        for ($x = 0; $x < $w-1; $x++)    { // each row
            for ($y = 0; $y < $h; $y++)    { // each pixel 
                     
                $rgbOrig = ImageColorAt($im, $x, $y); 
                $rOrig = (($rgbOrig >> 16) & 0xFF); 
                $gOrig = (($rgbOrig >> 8) & 0xFF); 
                $bOrig = ($rgbOrig & 0xFF); 
                 
                $rgbBlur = ImageColorAt($imgBlur, $x, $y); 
                 
                $rBlur = (($rgbBlur >> 16) & 0xFF); 
                $gBlur = (($rgbBlur >> 8) & 0xFF); 
                $bBlur = ($rgbBlur & 0xFF); 
                 
                // When the masked pixels differ less from the original 
                // than the threshold specifies, they are set to their original value. 
                $rNew = (abs($rOrig - $rBlur) >= $threshold)  
                    ? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig))  
                    : $rOrig; 
                $gNew = (abs($gOrig - $gBlur) >= $threshold)  
                    ? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig))  
                    : $gOrig; 
                $bNew = (abs($bOrig - $bBlur) >= $threshold)  
                    ? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig))  
                    : $bOrig; 
                 
                 
                             
                if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) { 
                        $pixCol = ImageColorAllocate($im, $rNew, $gNew, $bNew); 
                        ImageSetPixel($im, $x, $y, $pixCol); 
                    } 
            } 
        } 
    } 
    else{ 
        for ($x = 0; $x < $w; $x++)    { // each row 
            for ($y = 0; $y < $h; $y++)    { // each pixel 
                $rgbOrig = ImageColorAt($im, $x, $y); 
                $rOrig = (($rgbOrig >> 16) & 0xFF); 
                $gOrig = (($rgbOrig >> 8) & 0xFF); 
                $bOrig = ($rgbOrig & 0xFF); 
                 
                $rgbBlur = ImageColorAt($imgBlur, $x, $y); 
                 
                $rBlur = (($rgbBlur >> 16) & 0xFF); 
                $gBlur = (($rgbBlur >> 8) & 0xFF); 
                $bBlur = ($rgbBlur & 0xFF); 
                 
                $rNew = ($amount * ($rOrig - $rBlur)) + $rOrig; 
                    if($rNew>255){$rNew=255;} 
                    elseif($rNew<0){$rNew=0;} 
                $gNew = ($amount * ($gOrig - $gBlur)) + $gOrig; 
                    if($gNew>255){$gNew=255;} 
                    elseif($gNew<0){$gNew=0;} 
                $bNew = ($amount * ($bOrig - $bBlur)) + $bOrig; 
                    if($bNew>255){$bNew=255;} 
                    elseif($bNew<0){$bNew=0;} 
                $rgbNew = ($rNew << 16) + ($gNew <<8) + $bNew; 
                    ImageSetPixel($im, $x, $y, $rgbNew); 
            } 
        } 
    } 
    imagedestroy($imgCanvas); 
    imagedestroy($imgBlur); 
     
    // output
	Imagejpeg($im,$image_destination,$quality); 
  

	}
}
?>